/*!
 * Ext JS Library 3.1.0
 * Copyright(c) 2006-2009 Ext JS, LLC
 * licensing@extjs.com
 * http://www.extjs.com/license
 */
/**
 * @class Ext.DataView.LabelEditor
 * @extends Ext.Editor
 *
 */
Ext.DataView.LabelEditor = Ext.extend(Ext.Editor, {
    alignment: "tl-tl",
    hideEl: false,
    cls: "x-small-editor",
    shim: false,
    completeOnEnter: true,
    cancelOnEsc: true,
    labelSelector: 'span.x-editable',

    constructor: function (cfg, field) {
        Ext.DataView.LabelEditor.superclass.constructor.call(this,
            field || new Ext.form.TextField({
                allowBlank: false,
                growMin: 90,
                growMax: 240,
                grow: true,
                selectOnFocus: true
            }), cfg
        );
    },

    init: function (view) {
        this.view = view;
        view.on('render', this.initEditor, this);
        this.on('complete', this.onSave, this);
    },

    initEditor: function () {
        this.view.on({
            scope: this,
            containerclick: this.doBlur,
            click: this.doBlur
        });
        this.view.getEl().on('mousedown', this.onMouseDown, this, {delegate: this.labelSelector});
    },

    doBlur: function () {
        if (this.editing) {
            this.field.blur();
        }
    },

    onMouseDown: function (e, target) {
        if (!e.ctrlKey && !e.shiftKey) {
            var item = this.view.findItemFromChild(target);
            e.stopEvent();
            var record = this.view.store.getAt(this.view.indexOf(item));
            this.startEdit(target, record.data[this.dataIndex]);
            this.activeRecord = record;
        } else {
            e.preventDefault();
        }
    },

    onSave: function (ed, value) {
        this.activeRecord.set(this.dataIndex, value);
    }
});


Ext.DataView.DragSelector = function (cfg) {
    cfg = cfg || {};
    var view, proxy, tracker;
    var rs, bodyRegion, dragRegion = new Ext.lib.Region(0, 0, 0, 0);
    var dragSafe = cfg.dragSafe === true;

    this.init = function (dataView) {
        view = dataView;
        view.on('render', onRender);
    };

    function fillRegions() {
        rs = [];
        view.all.each(function (el) {
            rs[rs.length] = el.getRegion();
        });
        bodyRegion = view.el.getRegion();
    }

    function cancelClick() {
        return false;
    }

    function onBeforeStart(e) {
        return !dragSafe || e.target == view.el.dom;
    }

    function onStart(e) {
        view.on('containerclick', cancelClick, view, {single: true});
        if (!proxy) {
            proxy = view.el.createChild({cls: 'x-view-selector'});
        } else {
            if (proxy.dom.parentNode !== view.el.dom) {
                view.el.dom.appendChild(proxy.dom);
            }
            proxy.setDisplayed('block');
        }
        fillRegions();
        view.clearSelections();
    }

    function onDrag(e) {
        var startXY = tracker.startXY;
        var xy = tracker.getXY();

        var x = Math.min(startXY[0], xy[0]);
        var y = Math.min(startXY[1], xy[1]);
        var w = Math.abs(startXY[0] - xy[0]);
        var h = Math.abs(startXY[1] - xy[1]);

        dragRegion.left = x;
        dragRegion.top = y;
        dragRegion.right = x + w;
        dragRegion.bottom = y + h;

        dragRegion.constrainTo(bodyRegion);
        proxy.setRegion(dragRegion);

        for (var i = 0, len = rs.length; i < len; i++) {
            var r = rs[i], sel = dragRegion.intersect(r);
            if (sel && !r.selected) {
                r.selected = true;
                view.select(i, true);
            } else if (!sel && r.selected) {
                r.selected = false;
                view.deselect(i);
            }
        }
    }

    function onEnd(e) {
        if (!Ext.isIE) {
            view.un('containerclick', cancelClick, view);
        }
        if (proxy) {
            proxy.setDisplayed(false);
        }
    }

    function onRender(view) {
        tracker = new Ext.dd.DragTracker({
            onBeforeStart: onBeforeStart,
            onStart: onStart,
            onDrag: onDrag,
            onEnd: onEnd
        });
        tracker.initEl(view.el);
    }
};